package com.itcast.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itcast.dao.CheckGroupMapper;
import com.itcast.health.pojo.CheckGroup;
import com.itcast.health.pojo.PageResult;
import com.itcast.health.pojo.QueryPageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.*;

/**
 * @author Gao
 * @version v1.0
 * @date 2019/11/18 13:52
 * @description
 **/
@Service(interfaceClass = CheckGroupService.class )
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {
    @Autowired
    private CheckGroupMapper checkGroupMapper;
    @Autowired
    private JedisPool jedisPool;
    /**
     * 在addCheckGroup方法中完成增加检查组和对应信息添加
     *
     * @param checkGroup   检查组信息
     * @param checkitemIds 检查组对应的检查项id集合
     */
    @Override
    public void addCheckGroup(CheckGroup checkGroup, Integer[] checkitemIds) {
        checkGroupMapper.addCheckGroup(checkGroup);
        setCheckGroupAndCheckItem(checkGroup, checkitemIds);

        Jedis resource = jedisPool.getResource();
        resource.del("AllSetmeal");
        Set<String> keys = resource.keys("*");
        for (String key : keys) {
            if (key.contains("Setmeal")){
                resource.del("Setmeal");
            }
        }

    }

    /**
     * 检查组页码分页查询
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
        Page<CheckGroup> checkGroups=checkGroupMapper.findCheckGroupByCodeOrName(queryPageBean.getQueryString());
        return new PageResult(checkGroups.getTotal(),checkGroups);
    }

    /**
     * 根据id查询检查组
     *
     * @param id
     * @return
     */
    @Override
    public CheckGroup findCkeckGroupById(Integer id) {
        return checkGroupMapper.findCkeckGroupById(id);
    }

    /**
     * 根据id查询检查组所包含的检查项id
     *
     * @param id
     * @return
     */
    @Override
    public List<Integer> findcheckitemIdsByCheckGroupId(Integer id) {
        return checkGroupMapper.findcheckitemIdsByCheckGroupId(id);
    }

    /**
     * 修改检查组信息
     *
     * @param checkGroup
     * @param checkitemIds
     */
    @Override
    public void editckeckGroup(CheckGroup checkGroup, Integer[] checkitemIds) {
        //重新编辑检查组信息
        checkGroupMapper.editckeckGroupById(checkGroup);
        setCheckGroupAndCheckItem(checkGroup,checkitemIds);

        Jedis resource = jedisPool.getResource();
        resource.del("AllSetmeal");
        Set<String> keys = resource.keys("*");
        for (String key : keys) {
            if (key.contains("Setmeal")){
                resource.del("Setmeal");
            }
        }
    }

    /**
     * 根据id删除对应的检查组信息
     *
     * @param checkGroupid
     */
    @Override
    public void deleteCheckGroupById(Integer checkGroupid) {
        checkGroupMapper.deletecheckitemIdsBycheckGroupid(checkGroupid);
        checkGroupMapper.deleteCheckGroupById(checkGroupid);

        Jedis resource = jedisPool.getResource();
        resource.del("AllSetmeal");
        Set<String> keys = resource.keys("*");
        for (String key : keys) {
            if (key.contains("Setmeal")){
                resource.del("Setmeal");
            }
        }

    }

    /**
     * 向t_checkgroup_checkitem表插入数据
     * @param checkGroup
     * @param checkitemIds
     */
    private void setCheckGroupAndCheckItem(CheckGroup checkGroup, Integer[] checkitemIds) {

        if(checkGroup.getId() ==null) {
            //从前台来的数据为新建的数据 没有id(id要自动生成)
            checkGroup = checkGroupMapper.findCheckGroupByCode(checkGroup.getCode());
        }
        Integer checkGroupId = checkGroup.getId();
        if (checkitemIds.length>0){
            //为了避免过时  在添加前 需要删除该检查组对应的以前的检查项信息
            checkGroupMapper.deletecheckitemIdsBycheckGroupid(checkGroupId);
           /* 方法一
              此种方式会一次连接一下数据库
                为服务器带来较大压力  所以采用在mapper中使用foreach遍历来一次性传输数据
           for (Integer checkitemId : checkitemIds) {
               checkGroupMapper.addCheckGroupAndCheckItem(checkGroup.getId(),checkitemId);
            }*/
           //方法二
            List<Map> list=new ArrayList<>();
            for (Integer checkitemId : checkitemIds) {
                Map<String,Integer> map=new HashMap<>();
                map.put("checkGroupid",checkGroupId);
                map.put("checkitemId",checkitemId);
                list.add(map);
            }
            checkGroupMapper.addCheckGroupAndCheckItem(list);
        }
    }
}